﻿/*彩虹瓶的制作过程（并不）是这样的：先把一大批空瓶铺放在装填场地上，然后按照一定的顺序将每种颜色的小球均匀撒到这批瓶子里。

假设彩虹瓶里要按顺序装 N 种颜色的小球（不妨将顺序就编号为 1 到 N）。现在工厂里有每种颜色的小球各一箱，工人需要一箱一箱地将小球从工厂里搬到装填场地。如果搬来的这箱小球正好是可以装填的颜色，就直接拆箱装填；如果不是，就把箱子先码放在一个临时货架上，码放的方法就是一箱一箱堆上去。当一种颜色装填完以后，先看看货架顶端的一箱是不是下一个要装填的颜色，如果是就取下来装填，否则去工厂里再搬一箱过来。

如果工厂里发货的顺序比较好，工人就可以顺利地完成装填。例如要按顺序装填 7 种颜色，工厂按照 7、6、1、3、2、5、4 这个顺序发货，则工人先拿到 7、6 两种不能装填的颜色，将其按照 7 在下、6 在上的顺序堆在货架上；拿到 1 时可以直接装填；拿到 3 时又得临时码放在 6 号颜色箱上；拿到 2 时可以直接装填；随后从货架顶取下 3 进行装填；然后拿到 5，临时码放到 6 上面；最后取了 4 号颜色直接装填；剩下的工作就是顺序从货架上取下 5、6、7 依次装填。

但如果工厂按照 3、1、5、4、2、6、7 这个顺序发货，工人就必须要愤怒地折腾货架了，因为装填完 2 号颜色以后，不把货架上的多个箱子搬下来就拿不到 3 号箱，就不可能顺利完成任务。

另外，货架的容量有限，如果要堆积的货物超过容量，工人也没办法顺利完成任务。例如工厂按照 7、6、5、4、3、2、1 这个顺序发货，如果货架够高，能码放 6 只箱子，那还是可以顺利完工的；但如果货架只能码放 5 只箱子，工人就又要愤怒了……

本题就请你判断一下，工厂的发货顺序能否让工人顺利完成任务。

输入格式：*/

#include<stdio.h>
#include<stdlib.h>
#include<stack>
/*
data:2019.10.10-10.11 21:50
level:9.0
key:1 注意s.size是从0开始的
	2 栈由上至下，单调递增
user:Dongcheng Li
*/
#include<iostream>
using namespace std;

int _add(int* a, int n)//普通方式判断递增递减
{
	int flag = 1;//递增为0
	for (int i = 0; i < n - 1; i++)
	{
		if (a[i] > a[i + 1])
		{
			flag = 0; 
			break;
		}
	}
	return flag;
}
int main()
{
	stack <int>s;
	int i;
	int j;
	int u;//判断合法性专用数值
	int t;
	int c;//输入中转站
	int M;//M（堆栈最大容量）
	int N;//N（入栈元素个数）
	int K;//K（待检查的出栈序列个数）
	int a[1000];
	int b[1000];
	cin >> N;
	cin >> M;
	cin >> K;
	if (N > 1 && N <= 1000 && M <= N)
	{
		for (j = 0; j < K; j++)
		{
			
			u = 0;

			t = 1;
			for (i = 0; i < N; i++)
			{
				cin >> c;
				a[i] = c;
			}
			//cout << "d"<<d << endl;

			{
				for (i = 0; i < N; i++)//
				{
					if (a[i] == t)
					{
						b[t - 1] = t;//b 数组装的是最后出栈序列，栈是暂存区

						t++;
						while (s.empty() != 1 && s.top() == t)
						{//注意这里一旦相等，t已经被加了，栈顶是跟加后t相等，放完了1就看什么时候栈顶是2
							b[t - 1] = s.top();
							t++;
							s.pop();
						}
					}
					else {
						if (s.size() < M)//不能是<=有点麻烦，s.size是从0开始的要注意
						{
							if (s.empty() != 1 && s.top() < a[i])//栈非空且栈顶小于进来的元素，每次放入栈之前确保应该是检查栈是否递减
							{

								u = 1;
							}
							else
							{
								s.push(a[i]);
							}

						}
						else
						{
							
							u = 1;
						}

					}
				}
				while (!s.empty())
				{
					s.pop();
				}
				if (u)//单独剥离出来方便continue循环
				{
					cout << "NO" << endl;
					continue;
				}
				{
					if (_add(b, t - 1))//检测新数组b【o】是不是递增序列,上面最后时o++所以这里是
					{
						cout << "YES" << endl;
					}
					else//若有一个前后数是递减的
					{
						cout << "NO" << endl;
					}
				}
			}
		}
	}
	else
	{
		cout << "NO" << endl;
	}

}